/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package animacion;

import cern.jet.random.Exponential;
import cern.jet.random.engine.DRand;
import cern.jet.random.engine.RandomEngine;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author David
 */
public class servidor extends Thread {

    public double utilizacion;
    private int id_servidor;
    public int objetosservidos;
    private double delay;
    public boolean parototal = false;
    private double tiempoinicio;
    private double tiempofinal;
    private double tiempoocupado;
    private boolean activo = true;
    private Exponential p;
    public double tanscurrido= 0;
    private cola c;
    private salida s;
    RandomEngine rand = new DRand();
    AnimarCosas ACSalida;
    AnimarCosas ACServidor;

    public servidor(int id_servidor, double tiempoinicio, double delay, cola c, salida s) {
        this.id_servidor = id_servidor;
        this.tiempoinicio = tiempoinicio;
        this.delay = delay;
        this.c = c;
        this.s = s;

    }

    public void agregarAnimacion() {
        ACSalida = new AnimarCosas(c.ACSalida.entrada, c.ACSalida.salida, c.ACSalida.cola, c.ACSalida.panel, c.ACSalida.separador);
        ACSalida.deServidoraSalida();
        ACServidor = new AnimarCosas(c.ACSalida.entrada, c.ACSalida.salida, c.ACSalida.cola, c.ACSalida.panel, c.ACSalida.separador);
        ACServidor.deColaAServidor();
    }

    public synchronized double tasa() {
        p = new Exponential(1 / delay, rand);
        return p.nextDouble();
    }

    public void detener() {
        this.activo = false;
    }


    public int getObjetosservidos() {
        return objetosservidos;
    }

    public double getTiempoinicio() {
        return tiempoinicio;
    }

    public double getTiempofinal() {
        return tiempofinal;
    }

    public double getTiempoocupado() {
        return tiempoocupado;
    }

    @Override
    public void run() {

        while (activo) {

            objeto ahora = c.obtener();
            
            while (ahora == null && activo==true) {
                ahora = c.obtener();

            }
            if(activo==false)
            {
                break;
            }
            ahora.setFincola(generador.transcurrido);
            objetoanimado oa = new objetoanimado(ACServidor.panel, ACServidor.xinicial, ACServidor.yinicial, ACServidor.xfinal, ACServidor.yfinal);
            oa.start();
            System.out.println("Obtuvo objeto");
            double temp = 0;
            //CICLO DE RETARDO


            double tiempo = tasa();

            while ((temp < tiempo)&& activo==true) {
                temp = temp + 0.1;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(generador.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            //System.out.println("objeto servido en " + tiempo + "Servidor " + id_servidor);
            tiempoocupado=tiempoocupado+temp;
            ahora.setFinsistema(generador.transcurrido);
            objetoanimado oa2 = new objetoanimado(ACSalida.panel, ACSalida.xinicial, ACSalida.yinicial, ACSalida.xfinal, ACSalida.yfinal);
            oa2.start();
            objetosservidos++;
            s.agregar(ahora);

        }
 
        utilizacion=Math.rint((((tiempoocupado*100)/generador.transcurrido))*100)/100;
        if(utilizacion>100)
        {
            utilizacion=100;
        }
        System.out.println("Objetos Servidos en Servidor No" + id_servidor + " en total " + objetosservidos );
        parototal = true;
    }
}
